Firestore のセキュリティルールの書き方チートシート
便利関数たち
エイリアス的な者たちを最初に書いておく。これ以降のものはここに書いたものを使っていることがある。
// Auth でログイン済みかどうか
function isSignedIn() {
return request.auth.uid != null;
}
// Auth の user ID と一致するか
function isSameUser(userId) {
return isSignedIn() ? (request.auth.uid == userId) : false;
}
// リクエストのデータのエイリアス
function incomingData() {
return request.resource.data;
}
// リクエストに成功した後の状態の特定の path のデータを取得する
function getAfterData(path) {
return getAfter(path).data;
}
// 配列からドキュメントの path を作成する
function documentPath(paths) {
return path([
['databases', database, 'documents'].join('/'),
paths.join('/')
].join('/'));
}
// 使い方
documentPath(["users", likedUserID, "likedReviews", reviewID]);
// -> "database/{database}/documents/users/{likedUserID}/likedReviews/{reviewID}"
フィールドが存在することを確認する
"fieldName" in incomingData();
フィールドの型を検証する
incomingData().fieldName is string; // number なり timestamp なり
// よく存在確認と組み合わせて、こんな関数を作っている
function validate(data) {
return "fieldName" in data && data.fieldName is string
&& "another" in data && data.another is number;
}
サーバー時間と一致することを検証する
function isRequestedTime(time) {
return time == request.time;
}
参考
- Firestore Security Rules の書き方と守るべき原則
- Cloud Firestoreで「いいね」機能を実装するときの勘所 – su- tech blog
- まだ使ったことない便利関数もたくさんある